package cn.bisoft.java.util.os;

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;


/**
 * 一个简单的屏幕抓图
 * @author tangliang
 **/
public class ScreenCapturerUtil
{
	public static void main(String[] args) throws Exception
	{

		String userDir = System.getProperty("user.home");

		File tempFile = new File(userDir + "\\桌面\\" + DateUtil.format("dd-HH-mm-ss") + ".jpg");

		ScreenCapturerUtil capturer = ScreenCapturerUtil.getInstance();

		capturer.captureImage();

		capturer.saveAsJPEG(tempFile);

		ClipboardUtil.setImage(capturer.getPickedImage());

		System.exit(0);
	}

	private ScreenCapturerUtil()
	{
		try
		{
			robot = new Robot();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		JPanel cp = (JPanel) dialog.getContentPane();
		cp.setLayout(new BorderLayout());

		labFullScreenImage.addMouseListener(new MouseAdapter()
		{
			public void mouseReleased(MouseEvent evn)
			{
				isFirstPoint = true;
				pickedImage = fullScreenImage.getSubimage(recX, recY, recW, recH);

				dialog.setVisible(false);
			}
		});

		labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent evn)
			{
				if (isFirstPoint)
				{
					x1 = evn.getX();
					y1 = evn.getY();
					isFirstPoint = false;
				}
				else
				{
					x2 = evn.getX();
					y2 = evn.getY();
					int maxX = Math.max(x1, x2);
					int maxY = Math.max(y1, y2);
					int minX = Math.min(x1, x2);
					int minY = Math.min(y1, y2);
					recX = minX;
					recY = minY;
					recW = maxX - minX;
					recH = maxY - minY;
					labFullScreenImage.drawRectangle(recX, recY, recW, recH);
				}
			}

			public void mouseMoved(MouseEvent e)
			{
				labFullScreenImage.drawCross(e.getX(), e.getY());
			}
		});

		cp.add(BorderLayout.CENTER, labFullScreenImage);
		dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		dialog.setAlwaysOnTop(true);
		dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());
		dialog.setUndecorated(true);
		dialog.setSize(dialog.getMaximumSize());
		dialog.setModal(true);
	}

	/** Singleton Pattern */
	public static ScreenCapturerUtil getInstance()
	{
		return CPAUTERHELPER;
	}

	/** 捕获屏幕的一个矩形区域 */
	public void captureImage()
	{
		fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
		ImageIcon icon = new ImageIcon(fullScreenImage);
		labFullScreenImage.setIcon(icon);

		dialog.setVisible(true);
	}

	/** 得到捕获后的BufferedImage */
	public BufferedImage getPickedImage()
	{
		return pickedImage;
	}

	/** 得到捕获后的Icon */
	public ImageIcon getPickedIcon()
	{
		return new ImageIcon(getPickedImage());
	}

	/** 储存为一个文档,为PNG格式 */
	public void saveAsPNG(File file) throws Exception
	{
		ImageIO.write(getPickedImage(), "png", file);
	}

	/** 储存为一个JPEG格式图像文档 */
	public void saveAsJPEG(File file) throws Exception
	{
		ImageIO.write(getPickedImage(), "JPEG", file);
	}

	/** 写入一个OutputStream */
	public void write(OutputStream out) throws Exception
	{
		ImageIO.write(getPickedImage(), defaultImageFormater, out);
	}

	// singleton design pattern
	private static ScreenCapturerUtil CPAUTERHELPER = new ScreenCapturerUtil();

	private int x1, y1, x2, y2;

	private int recX, recY, recH, recW; // 截取的图像

	private boolean isFirstPoint = true;

	private BackgroundImage labFullScreenImage = new BackgroundImage();

	private Robot robot;

	private BufferedImage fullScreenImage;

	private BufferedImage pickedImage;

	private String defaultImageFormater = "png";

	private JDialog dialog = new JDialog();
}

/** 显示图片的Label */
class BackgroundImage extends JLabel
{
	private static final long serialVersionUID = 1L;

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.drawRect(x, y, w, h);
		String area = Integer.toString(w) + " * " + Integer.toString(h);
		g.drawString(area, x + (int) w / 2 - 15, y + (int) h / 2);
		g.drawLine(lineX, 0, lineX, getHeight());
		g.drawLine(0, lineY, getWidth(), lineY);

		g.drawLine(0, 0, getWidth(), 0);
		g.drawLine(0, 0, 0, getHeight());
		g.drawLine(getWidth(), getHeight(), 0, getHeight());
		g.drawLine(getWidth(), getHeight(), getWidth(), 0);
	}

	public void drawRectangle(int x, int y, int width, int height)
	{
		this.x = x;
		this.y = y;
		h = height;
		w = width;
		repaint();
	}

	public void drawCross(int x, int y)
	{
		lineX = x;
		lineY = y;

		repaint();
	}

	int lineX, lineY;

	int x, y, h, w;
}